﻿using System;
using System.Web.Mvc;
using Contact.DAL.Models.Worktime;
using ContactMvc4TB.Helpers.HelperClasses;
using ContactMvc4TB.Helpers.RightsManagement;
using ContactMvc4TB.Models.Worktime.Helpers;
using EFDataModel;
using EFDataModel.Enums;
using GlobalResources;

namespace ContactMvc4TB.Models.Worktime
{
    /// <summary>
    /// Modeldaten zum Erstellen eines Projekteintrags
    /// </summary>
    public class WorktimeProjectCreateModel : ProjectEntry
    {
        #region Member
        /// <summary>
        /// Der Aktuelle CurrentController um hier auch Messages ausgeben zu können.
        /// </summary>
        private Controller CurrentController { get; set; }

        /// <summary>
        /// Die aktuelle UserId
        /// </summary>
        public long UserId { get; set; }
        #endregion

        #region Public Functions
        /// <summary>
        /// Funktion zum Initialisieren der Daten für das Model, muss immer als erstes aufgerufen werden.
        /// </summary>
        /// <param name="controller">Der Aktuelle Controller</param>
        /// <param name="userId">die Passende UserId</param>
        /// <param name="projectId">die passende ProjektId oder 0 wenn es sich um eine neue handelt.</param>
        public void InitializeData(Controller controller, long userId, long projectId)
        {
            CurrentController = controller;
            UserId = userId;
            Id = projectId;
        }

        /// <summary>
        /// Laden der passenden Modeldaten.
        /// </summary>
        /// <returns>TRUE->Laden erfolgreich | FALSE->Die Daten konnten nicht geladen werden</returns>
        public bool LoadModelData()
        {
            //Prüfen ob es sich nicht um einen neuen Eintrag handelt.
            if (Id != 0)
            {
                //Laden der passenden Projektdaten für das aktuelle Model, da eine ProjektId übergeben wurde.
                WorktimeSettingsRepository model = new WorktimeSettingsRepository(CurrentHttpContext.GetDataModel());
                EFWorktimeProject project = model.LoadProject(Id);
                if (project != null)
                {
                    //Prüfen ob der User das Recht hat die Projektdaten zu bearbeiten für sich selbst bzw. für eine andere Person
                    if (WebRights.Right().Check(EUserRights.WorktimeSaveProject) || project.EFWorktimeSetting.EFAuthentication.ID == UserId)
                    {
                        Name = project.Name;
                        Sortorder = project.Sortorder;
                        Description = project.Description;
                        ShowEntry = project.ShowEntry;
                        return true;
                    }
                    else
                    {
                        CustomMessage.CurrentMessage(CurrentController).AddMessage(SystemMessages.NoRightsToEditWorktimeProjectData, MessageTypes.error);
                        return false;
                    }
                }

                CustomMessage.CurrentMessage(CurrentController).AddMessage(SystemMessages.WorktimeProjectNotFound, MessageTypes.error);
                return false;    
            }
            else
            {
                //Bei einem Neuen Eintrag die folgenden Werte setzten.
                ShowEntry = true;
            }

            return true;
        }

        /// <summary>
        /// Speichern/Anlegen der Modeldaten
        /// </summary>
        public bool SaveModelData()
        {
            //Achtung hier muss ebenfalls überprüft werden, ob der User das Recht hat die Daten anderer Nutzer zu bearbeiten
            //Wenn nicht muss die UserId mit der aktuellen UserId übereinstimmen die eingeloggt ist, sonst versucht jmd die Daten eines anderen zu bearbeiten.
            if (WebRights.Right().Check(EUserRights.WorktimeSaveProject) || CurrentSession.GetCurrentUser().ID == UserId)
            {
                WorktimeSettingsRepository repository = new WorktimeSettingsRepository(CurrentHttpContext.GetDataModel());
                EFWorktimeProject project = new EFWorktimeProject();
                if (Id != 0)
                {
                    project = repository.LoadProject(Id);
                    //Prüfen ob der Eintrag auch geladen werden konnte.
                    if (project == null)
                    {
                        CustomMessage.CurrentMessage(CurrentController).AddMessage(SystemMessages.WorktimeProjectEntryNotFound, MessageTypes.error);
                        return false;
                    }
                }

                //Anpassen der Werte.
                project.Name = Name;
                project.Description = Description;
                project.Sortorder = Sortorder;
                project.ShowEntry = ShowEntry;
                //Speichern der Werte.
                if (repository.SaveProject(project, UserId))
                {
                    CustomMessage.CurrentMessage(CurrentController).AddMessage(SystemMessages.SaveSuccessfullRESX, MessageTypes.ok);
                    return true;
                }
            }
            else
            {
                CustomMessage.CurrentMessage(CurrentController).AddMessage(SystemMessages.NoRightsToEditWorktimeProjectData, MessageTypes.error);
            }

            CustomMessage.CurrentMessage(CurrentController).AddMessage(SystemMessages.SaveError, MessageTypes.error);
            return false;
        }

        /// <summary>
        /// Löschen des passenden Projekteintrags aus der DB. - Prüft auch ob dies überhaupt möglich ist.
        /// </summary>
        public bool DeleteProjectEntry()
        {
            WorktimeSettingsRepository repository = new WorktimeSettingsRepository(CurrentHttpContext.GetDataModel());
            EFWorktimeProject worktimeProject = repository.LoadProject(Id);
            if (worktimeProject != null)
            {
                //Der Eintrag kann nur gelöscht werden, wenn er noch keinem Arbeitszeiteintrag zugewiesen wurde.
                if (worktimeProject.EFWorktimeEntry.Count == 0)
                {
                    //Versuchen den Eintrag zu löschen
                    if (repository.DeleteProject(Id))
                    {
                        CustomMessage.CurrentMessage(CurrentController).AddMessage(String.Format(SystemMessages.ListEntryDeletedRESX, worktimeProject.Name), MessageTypes.ok);
                    }
                    else
                    {
                        CustomMessage.CurrentMessage(CurrentController).AddMessage(SystemMessages.ListEntryDeleteError, MessageTypes.error);
                    }
                }
                else
                {
                    CustomMessage.CurrentMessage(CurrentController).AddMessage(SystemMessages.DeleteErrorWorktimeProjectInUse, MessageTypes.error);
                }
            }
            else
            {
                CustomMessage.CurrentMessage(CurrentController).AddMessage(SystemMessages.ListEntryNotFoundRESX, MessageTypes.error);
            }

            return false;
        }
        #endregion
    }
}